In [1]:
import re
import nltk
from prep import helpers

Mineria de Texto

Una brevísima introducción

Minería de Texto: una brevísima introducción

  • Qué es?
  • Y qué se hace con eso?
  • Qué no es?
  • Más o menos, cómo funciona?

Minería de Texto: una brevísima introducción

  • Temás prácticos:
    • Fuentes de texto
    • Datos estructurados, semi-estructurados y no estructurados
    • Mojibake!
    • RegEx: Cómo resolver un problema con otro problema

Minería de Texto: una brevísima introducción

  • Conceptos fundamentales
  • Representación del texto para análisis
    • bag of words
    • tf-idf
  • Similaridad entre documentos

Qué es Minería de Texto?


Destilar conocimiento a partir del texto

Desde el punto de vista de el analisis de datos, el texto es un desorden. Las técnicas de analisis desde la más sencilla hasta la más avanzada esperan trabajar con datos de entrada con formato bien definido y fijo.

La minería de texto es la colección de métodos, algoritmos y prácticas utilizadas para ordenar este desorden y poder realizar análisis sobre grandes cuerpos de texto.

Y qué se hace con eso?

  • Búsqueda (Information Retrieval)
  • Clasificación de texto (SPAM! SPAM!)
  • Modelado de tópicos (temas)
  • Clustering
  • Analisis de sentimiento
  • etc... etc... etc...

Qué no es Minería de Texto?

Procesamiento de Lenguaje Natural o Natural Language Processing es un área de las ciencas computacionales que se ocupa de la interacción entre las computadoras y el lenguaje humano (natural).

Text Mining depende de muchas de las herramientas de NLP, de hecho en los ejemplos estaremos usando la librería NLTK - Natural Language ToolKit. Dos ejemplos famosos de NLP son: chatbots y Siri

Más o menos, cómo funciona?

Temas prácticos - Fuentes de texto

  • Redes sociales (tweets, posts)
  • Articulos, libros, periódicos
  • Bases de datos
  • ...

Temas Prácticos - Tipos de datos como fuentes de texto


Temas Prácticos - Codificación de caracteres (encodings, encodings)

La codificación de caracteres determina cómo se convierten los bits en caracteres legibles y viceversa.

Se hace vital conocer la codificación usada durante la creación de un documento para poder incluirlo en un proceso de minería de texto.

Lamentablemente, no siempre se sabe esto. Pero, se puede adivinar con mucho exito y se puede convertir de una codificación a otra.

Temas Prácticos - Mojibakeeeee???



Esto le puede pasar a usted si procesa texto con la codificación de caracteres (character encoding) equivocada:


Cómo salgo de un lío mojibake?

StackOverflow al rescate: https://stackoverflow.com/questions/64860/best-way-to-convert-text-files-between-character-sets. En resumen: herramientas de línea de comando (*nix y Windows)

También su librería de R/Python para la manipulación de datos (tidyverse/Pandas) le permite especificar la codificación tanto de lectura como de escritura.

Si algún día se ve en la necesidad de adivinar, empiece por aquí: https://readr.tidyverse.org/reference/encoding.html

Temas Prácticos - RegEx

Cómo resolver un problema con otro problema

En esencia las expresiones regulares permiten:

  • Encontrar instancias de un término
  • ...Aún cuando este escrito de formas ligeramente diferentes cada vez
  • Convertirlo en otra cosa
  • Convertir frases enteras en otras
  • Hacer cambios a un documento de una sola vez
  • ... lograr que estos cambios sean consistente y repetibles a otros documentos

Temas Prácticos - RegEx: Ejemplo


In [2]:
# Funcion para quitar todo el texto que este entre parentesis, 
# lo que no sea letras y sustituir series de espacios en blanco por uno solo
def cleanup_str(raw):
    rs = re.sub("\\(.*?\\)|[^a-zA-Z\\s]"," ",raw)
    rs = re.sub("\\s+"," ",rs).strip().lower()
    return rs

my_str = """
Some people, when confronted with a problem, think 
“I know, I'll use regular expressions.”   Now they have two problems.
    -- Jamie Zawinsk (Usenet) 1997   o fue 1999??
"""

print(cleanup_str(my_str))


some people when confronted with a problem think i know i ll use regular expressions now they have two problems jamie zawinsk o fue

Visite https://regexr.com/ para aprender y practicar. Pero, recuerde:

Las expresiones regulares son una herramienta extremadamente poderosa, uselas con moderación y cuidado

Conceptos Fundamentales de Mineria de Texto


Documento
Unidad mínima de texto sobre la cual se quiere realizar analisis, inferencias y responder preguntas
Corpus
Conjunto de documentos que será minado (piense _training data_)

Conceptos Fundamentales de Mineria de Texto


Token
Serie de caracteres de texto con significado propio, resultante de dividir un documento por un _separador_: tipicamente palabras.
Separador
Serie de caraceteres utilizadas para dividir un documento en _tokens_: tipicamente _whitespace_ ( )

In [3]:
nltk.word_tokenize("conceptos fundamentales de mineria de texto")


Out[3]:
['conceptos', 'fundamentales', 'de', 'mineria', 'de', 'texto']

Conceptos Fundamentales de Mineria de Texto


Vocabulario
Conjunto de todos los tokens presentes en un _corpus_
n-gram
Secuencia continua de una o más partes de un documento, tipicamente tokens

In [4]:
helpers.get_bigrams(nltk.word_tokenize("conceptos fundamentales de mineria de texto"))


Out[4]:
['conceptos fundamentales',
 'fundamentales de',
 'de mineria',
 'mineria de',
 'de texto']

Conceptos Fundamentales de Mineria de Texto


Stopwords
Palabras en un idioma particular que pueden eliminarse de los documentos durante preprocesamiento (palabras muy comunes, preposiciones, etc.)
Stemming
Proceso de extracción y sustitución de palabras por su _"raíz"_

In [5]:
helpers.remove_stopwords("This is not the stopword")


Out[5]:
'This stopword'

In [6]:
helpers.stem("natural language processing and text mining")


Out[6]:
'natur languag process and text mine'

Representación de datos de texto


Representación de datos de Texto


Representación de datos de Texto


Term Frequency (TF)
Estadistica que representa lo común que es un término dentro de un documento en particular. La versión más simple es un conteo de las repeticiones del termino.
Inverse Document Frequency (IDF)
Estadistica que captura lo _raro_ que es un termino dentro de un corpus. Es grande para palabras que ocurren poco y pequeño para palabras muy comunes.

La formula más comun de TF-IDF:

$$tfidf(t,d,D) = f_{t,d} * \log \frac{N}{n_t}$$

donde:

$t =$ termino, token o palabra

$d =$ documento

$f_{t,d} =$ term frequency del termino t en el documento d

$D =$ corpus

$N =$ cantidad de documentos (tamaño del corpus)

$n_t =$ cantidad de documentos donde aparece el termino $t$

Con tan solo convertir un corpus a una de estas dos representaciones se pueden responder preguntas interesantes, como:

  • Cuales son las palabras mas frecuentes?
  • Cuales son las palabras mas raras?
  • Cuales son los documentos con más palabras distintas?

Se les ocurren otras?

Comparación de documentos

Habiendolos representado como vectores (BoW o TF-IDF) podemos compararlos directamente en relación de los terminos que los componen con una simple distancia entre dos vectores:

$$similaridad = \cos(\theta) = \frac{\sum_i^N A_i B_i}{\sum_i^N A_i^2 \sum B_i^2}$$

Con lo descrito hasta ahora tenemos los elementos necesarios para un buscador rudimentario:

  1. los documentos ya son vectores comparables
  2. podemos convertir un nuevo documento a un vector (un "query" de búsqueda por ejemplo)
  3. sencillamente buscar en el corpus los documentos que más se parezcan (que tengan la similaridad más alta)
  4. ...
  5. Google-Killer!